package net.oschina.victor.liu.lemon.common;

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.junit.BeforeClass;
import org.springframework.mock.web.MockServletContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.XmlWebApplicationContext;
import org.springframework.web.servlet.HandlerAdapter;
import org.springframework.web.servlet.HandlerExecutionChain;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter;
import org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping;

/**
 * @ClassName: JUnitActionBase
 * @Description: 这里用一句话描述这个类的作用
 *
 */
public class JUnitActionBase {
	private static HandlerMapping handlerMapping;
	private static HandlerAdapter handlerAdapter;

	/**
	 * 读取spring3 MVC配置文件
	 * 
	 * @throws UnsupportedEncodingException
	 */
	@BeforeClass
	public static void setUp() throws UnsupportedEncodingException {
		if (handlerMapping == null) {
			File file = new File(Thread.currentThread().getContextClassLoader().getResource("").getPath());
			String separator = File.separator;
			String path = URLDecoder.decode(file.getAbsolutePath(), "utf-8").replace("", "").replace("\\", "/");
			// String[] configs = { "file:" + path + separator +
			// "servlet-context.xml",
			// "file:" + path + separator + "service-context.xml" };
			String[] configs = { "file:" + path + separator + "spring-context.xml",
					"file:" + path + separator + "spring-mvc.xml", };
			XmlWebApplicationContext context = new XmlWebApplicationContext();
			context.setConfigLocations(configs);
			MockServletContext msc = new MockServletContext();
			context.setServletContext(msc);
			context.refresh();
			msc.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, context);
			handlerMapping = (HandlerMapping) context.getBean(DefaultAnnotationHandlerMapping.class);
			handlerAdapter = (HandlerAdapter) context
					.getBean(context.getBeanNamesForType(AnnotationMethodHandlerAdapter.class)[0]);
		}
	}

	/**
	 * 执行request对象请求的action
	 * 
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	public ModelAndView excuteAction(HttpServletRequest request, HttpServletResponse response) throws Exception {
		HandlerExecutionChain chain = handlerMapping.getHandler(request);
		ModelAndView model = null;/*
									 * handlerAdapter.handle(request, response,
									 * chain.getHandler());
									 */
		// 这里需要声明request的实际类型，否则会报错
		request.setAttribute(HandlerMapping.INTROSPECT_TYPE_LEVEL_MAPPING, true);
		try {
			model = handlerAdapter.handle(request, response, chain.getHandler());
		} catch (Exception e) {
			e.printStackTrace();
		}
		return model;

	}
}